#define _CRT_SECURE_NO_WARNINGS		//loacltime()函数需要这个宏
//头文件#include<chrono>,实现一系列时间相关的操作(时间长度，系统时间和计时器)



//时间长度
//duration模板类用于表示一段时间(时间长度，时钟周期)例如1小时，8分钟，3秒
#include<iostream>
#include<chrono>
using namespace std;

int main()
{
	chrono::hours t1(1);					//1小时
	chrono::minutes t2(60);					//60分钟
	chrono::seconds t3(60 * 60);			//3600秒
	chrono::milliseconds t4(60 * 60 * 1000);//3600*1000毫秒
	chrono::microseconds t5(12);				//微妙
	chrono::nanoseconds	t6(33);				//纳秒
	//需要注意，括号里的类型是int，所以参数不能超过INT_MAX

	//可以相互转换
	if (t1 == t2)	cout << "t1==t2" << endl;
	if (t1 == t3)	cout << "t1==t3" << endl;
	if (t1 == t4)	cout << "t1==t4" << endl;	//if()全部返回true

	//获取时钟周期的值，返回的是int整数,同时印证创建变量是参数不能超过INT_MAX
	cout << "t1 = " << t1.count() << endl;		//1
	cout << "t2 = " << t2.count() << endl;		//60
	cout << "t3 = " << t3.count() << endl;		//3600
	cout << "t4 = " << t4.count() << endl;		//3600000

	return 0;
}




#include<iomanip>	//put_time()函数所需头文件
#include<sstream>	
系统时间
获取系统时间有以下四个步骤
int main()
{
	//1)静态成员函数chrono::system_clock::now() 获取系统时间
	chrono::time_point<chrono::system_clock> now = chrono::system_clock::now();
	//也可以用auto自动推导 auto now = chrono::system_clock::now();是一样的

	//2)静态成员函数chrono::system_clock::to_time_t() 把系统时间转换为time_t（UTC时间）
	time_t t_now = chrono::system_clock::to_time_t(now);

		//时间偏移，在UTC时间加上偏移量即可，偏移量单位为秒
		//例如 t_now += 12*60*60;	//t_now就变成当前时间的后一天


	//3)std::localtime()函数把time_t转换成本地时间(北京时间)
	//localtime()并不是线程安全的，VS用loacltime_s代替，Linux用localtime_r代替
	tm* tm_now = localtime(&t_now);

	//4)格式化输出本地时间	需要引入头文件#include<iomanip>
	cout << put_time(tm_now, "%Y-%m-%d %H:%M:%S") << endl;	//具体格式可以自定义
	cout << put_time(tm_now, "%Y-%m-%d ") << endl;
	cout << put_time(tm_now, "%H:%M:%S") << endl;
	cout << put_time(tm_now, "%Y%m%d%H%M%S") << endl;
	/*
	2024-07-30 16:23:13
	2024-07-30
	16:23:13
	20240730162313
	*/


	//若想将时间保存到字符串中
	stringstream ss;	//创建stringstream对象ss,需要包含#include<sstream>头文件
	ss << put_time(tm_now, "%Y-%m-%d %H:%M:%S");	//把时间输入到对象ss中
	string str = ss.str();		//把ss转换成string对象
	cout << str << endl;		//2024-07-30 16:23:13


	//若想将字符串表示的时间转换为C++时间（即time_point对象）
	//大致思路就是获取系统时间的步骤反过来，过程较为复杂，需要用到下面这个模板

	//将time_t类型转换为时间点timr_point类型
	//static std::chrono::system_clock::time_point from_time_t( std::time_t t ) noexcept;


	return 0;
}
 






//计时器
//steady_clock类相当于秒表，操作系统只要启动就会进行时间的累加，常用于耗时的统计(精确到纳秒)


int main()
{
	//静态成员函数chrono::steady_clock::now()获取开始的时间点
	chrono::steady_clock::time_point start = chrono::steady_clock::now();
	//也可以用auto


	//执行一些代码，消耗时间
	cout << "计时开始..." << endl;
	for (int ii = 0; ii < 10000; ii++)
	{
		cout << "hello" << endl;
	}
	cout << "计时完成..." << endl;

	//静态成员函数chrono::steady_clock::now()获取结束的时间点
	chrono::steady_clock::time_point end = chrono::steady_clock::now();

	//计算耗时的时间，单位是纳秒
	auto dt = end - start;
	cout << "耗时: " << dt.count() << "纳秒(" << (double)dt.count() / (1000 * 1000 * 1000) << ")" << endl;
	

	return 0;
}

